package top.huashengshu.common;

import org.springframework.core.io.Resource;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class HttpDownloadUtils {
    /**
     * 创建目录：如果不存在则创建然后返回true，如果存在直接返回true
     * @param destDirName  目录名全路径 盘符驱动+路径
     * @return
     */
    public static boolean createDirect(String destDirName) {
        File file = new File(destDirName);
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        return true;
    }


    /**
     * 下载文件的作用，需要3个参数 资源原路径，真正下载的url，保存本地的路径
     *
     * @param refererUrl 视频的参考路径，
     * @param url        真正下载的url链接，可以是m4s文件和audio文件，下载后需要合并
     * @param savePath   保存的路径
     * @return 下载成功则返回true，中间报异常则进行自旋下载文件
     */
    public static boolean downloadFile(String refererUrl, String url, String savePath) {
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.add("referer",refererUrl);//设置请求头
        HttpEntity<String> entity = new HttpEntity<String>("", headers);
        ResponseEntity<Resource> in = restTemplate.exchange(url, HttpMethod.GET, entity, Resource.class);
        try (InputStream is = in.getBody().getInputStream()) {//java9新特性自动关闭流
            boolean flag = createDirect(savePath);
            if (flag) {
                try (FileOutputStream fos = new FileOutputStream(savePath);) {
                    is.transferTo(fos);//写入输出流
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } catch (IOException e) {
            downloadFile(refererUrl,url,savePath);//异常则进行重新下载
        }
        return true;
    }
}
